hhkb
Python

파이썬기초_05_데코레이터와 클로저

작성자 : Heehyeon Yoo|2025-12-26
# Python# Decorator# Closure

1. 클로저 (Closure)

데코레이터를 이해하기 위한 필수 선수 지식.

  • 정의:
    • 자신을 감싼 외부 스코프(Outer Scope)의 변수를 기억하고 있는 내부 함수.
    • 외부 함수가 실행이 끝나고 소멸(Return)되어도, 내부 함수가 그 변수를 계속 붙들고 있는 현상.
  • 조건:
    1. 함수 안에 함수(중첩 함수)가 있어야 함.
    2. 내부 함수가 외부 함수의 변수를 참조해야 함.
    3. 외부 함수가 내부 함수를 반환(Return)해야 함.
  • 비유:
    • 타임캡슐. 공장(외부 함수)은 문을 닫았는데, 그 안에서 만든 제품(내부 함수)이 공장의 재료(외부 변수)를 여전히 품고 있음.

2. 데코레이터 (Decorator)

기존 함수를 수정하지 않고 앞뒤에 부가 기능을 추가(장식)하고 싶을 때 사용.

  • 개념:
    • 클로저(Closure)를 활용한 문법적 설탕(Syntactic Sugar).
    • @ 기호를 사용하여 함수 위에 얹음.
  • 원리:
    • target_func = decorator(target_func) 와 완전히 동일함.
    • 함수를 파라미터로 받아서, 기능이 추가된 새로운 함수(Wrapper)를 반환하는 것.

3. 기본 구조

def my_decorator(func):
    def wrapper():
        print("1. 함수 실행 전")
        func()  # 원본 함수 실행
        print("2. 함수 실행 후")
    return wrapper

@my_decorator
def hello():
    print("Hello World")

# 실행
hello() 
# 출력:
# 1. 함수 실행 전
# Hello World
# 2. 함수 실행 후

4. 실전 활용 예시

개발할 때 실제로 자주 쓰는 패턴들.

A. 실행 시간 측정 (Timer)

  • 상황: 내 코드가 얼마나 빠른지/느린지 성능 테스트할 때.
  • 구현: 원본 함수 실행 전 시간 기록 start → 실행 → 후 시간 기록 endend - start 출력.

B. 로그인/권한 체크 (Authentication)

  • 상황: 특정 페이지나 API는 로그인한 사람만 써야 함.
  • 구현:
    • 데코레이터 내부(wrapper)에서 if user.is_logged_in: 확인.
    • 로그인 안 했으면 함수 실행 안 하고 에러 반환.
    • 로그인 했으면 func() 실행.
  • 장점: 핵심 비즈니스 로직(글쓰기, 조회 등)에 지저분한 if문을 다 뺄 수 있음. (관심사의 분리)

5. functools.wraps

  • 문제점: 데코레이터를 쓰면 원본 함수의 이름(__name__)과 설명(__doc__)이 wrapper 함수 것으로 덮어씌워짐.
  • 해결: @functools.wraps(func)wrapper 위에 붙여주면 원본 함수의 메타데이터를 유지해줌. (국룰)